/*
 * GJexer - GPL Java Text User Interface
 *
 * The GNU General Public License Version 3
 *
 * Copyright (C) 2021 Autumn Lamonte
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @author Autumn Lamonte [AutumnWalksTheLake@gmail.com] ⚧ Trans Liberation Now
 * @version 1
 */
package gjexer.net;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

/**
 * This class provides a ServerSocket that return TelnetSocket's in accept().
 */
public class TelnetServerSocket extends ServerSocket {

    // ------------------------------------------------------------------------
    // Variables --------------------------------------------------------------
    // ------------------------------------------------------------------------


    // ------------------------------------------------------------------------
    // Constructors -----------------------------------------------------------
    // ------------------------------------------------------------------------

    /**
     * Creates an unbound server socket.
     *
     * @throws IOException if an I/O error occurs
     */
    public TelnetServerSocket() throws IOException {
        super();
    }

    /**
     * Creates a server socket, bound to the specified port.
     *
     * @param port the port number, or 0 to use a port number that is
     * automatically allocated.
     * @throws IOException if an I/O error occurs
     */
    public TelnetServerSocket(final int port) throws IOException {
        super(port);
    }

    /**
     * Creates a server socket and binds it to the specified local port
     * number, with the specified backlog.
     *
     * @param port the port number, or 0 to use a port number that is
     * automatically allocated.
     * @param backlog requested maximum length of the queue of incoming
     * connections.
     * @throws IOException if an I/O error occurs
     */
    public TelnetServerSocket(final int port,
        final int backlog) throws IOException {

        super(port, backlog);
    }

    /**
     * Create a server with the specified port, listen backlog, and local IP
     * address to bind to.
     *
     * @param port the port number, or 0 to use a port number that is
     * automatically allocated.
     * @param backlog requested maximum length of the queue of incoming
     * connections.
     * @param bindAddr the local InetAddress the server will bind to
     * @throws IOException if an I/O error occurs
     */
    public TelnetServerSocket(final int port, final int backlog,
        final InetAddress bindAddr) throws IOException {

        super(port, backlog, bindAddr);
    }

    // ------------------------------------------------------------------------
    // ServerSocket -----------------------------------------------------------
    // ------------------------------------------------------------------------

    /**
     * Listens for a connection to be made to this socket and accepts it. The
     * method blocks until a connection is made.
     *
     * @return the new Socket
     * @throws IOException if an I/O error occurs
     */
    @Override
    public Socket accept() throws IOException {
        if (isClosed()) {
            throw new SocketException("Socket is closed");
        }
        if (!isBound()) {
            throw new SocketException("Socket is not bound");
        }

        Socket socket = new TelnetSocket();
        implAccept(socket);
        return socket;
    }

}
